﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//struct timer
//{
//    timer(int t = 0, int d = 0, int l = 0)
//        :_t(t)
//        , _d(d)
//        , _l(l)
//    {}
//    int _t;
//    int _d;
//    int _l;
//};
//
//struct compare
//{
//    bool operator () (const timer& t1, const timer& t2)
//    {
//        if (t1._d == t2._d)
//        {
//            if (t1._l == t2._l)
//            {
//                return t1._t < t2._t;
//            }
//            return t1._l < t2._l;
//        }
//
//        // 这里是希望那个排序后的升序、降序，
//        return (t1._d) < (t2._d);
//    }
//};
//
//bool dfs(const bool* flag, int n)
//{
//    for (int i = 0; i < n; ++i)
//    {
//        if (flag[i] == false)
//            return false;
//    }
//    return true;
//}
//
//void retire(bool* flag, int n)
//{
//    for (int i = 0; i < n; ++i)
//    {
//        flag[i] = false;
//    }
//}
//
//int main()
//{
//    int T;
//    cin >> T;
//    while (T--)
//    {
//        int n;
//        cin >> n;
//        vector<timer> ti(n, 0);
//        for (int i = 0; i < n; ++i)
//        {
//            cin >> ti[i]._t >> ti[i]._d >> ti[i]._l;
//        }
//        bool f[11] = { 0 };
//        for (int i = 0; i < n; ++i)
//        {
//            // 先将i位置插入在起始时间
//            int begin = max(ti[i]._t, begin) + ti[i]._l;;
//            if (ti[i]._d < begin)
//                continue;
//            for (int j = i + 1; j != i; ++j)
//            {
//                j %= n;
//                begin = max(ti[j]._t, begin) + ti[j]._l;
//                if (ti[i]._d < begin)
//                    break;
//                f[i] = true;
//            }
//        }
//        if (dfs(f, n))
//            cout << "YES" << endl;
//        else
//            cout << "NO" << endl;
//    }
//
//    return 0;
//}

//#include <iostream> // bits/C++
//#include <algorithm>
//using namespace std;
//int t, n, bk[15];
//struct plane
//{
//    int t, d, l;
//}a[15];
//
//             // 记录符合的数组元素个数
//bool dfs(int dep, int tim)
//{
//    if (dep > n)
//        return 1;
//    for (int i = 1; i <= n; i++)
//    {
//        // 已经判断过得跳过
//        // 符合条件的           不满足条件的去掉
//        if (bk[i] || a[i].t + a[i].d < tim)//降落条件
//            continue;
//        // 标记数组 ， 1代表行，0代表不行
//        bk[i] = 1;
//        // 重复遍历，用不同的时间来查看是否符合规则。
//        if (dfs(dep + 1, max(tim, a[i].t) + a[i].l))//记得取max
//        {
//            bk[i] = 0;
//            return 1;//有一个成功就返回1
//        }
//        bk[i] = 0;//记得去标记
//    }
//    return 0;
//}
//int main()
//{
//    scanf("%d", &t);
//
//    while (t--)
//    {
//        scanf("%d", &n);
//        for (int i = 1; i <= n; i++)
//        {
//            scanf("%d%d%d", &a[i].t, &a[i].d, &a[i].l);
//        }
//        memset(bk, 0, sizeof(bk));//记得清空
//        if (dfs(1, 0))
//            printf("YES\n");
//        else
//            printf("NO\n");
//    }
//}

//#include <stdio.h>
//#include <stdlib.h>
//typedef struct s
//{
//  int reach;
//  int Latest;
//  int Sum_Time;
//}FET;
//void Fun(int n, FET FN[]);
//char * Yes_No(int i, int j, FET FN[]);
//void Swap(FET* a, FET* b);
//int Max(int x, int y);
//void Fun(int n, FET FN[])
//{
//    while (n-- > 0)
//    {
//        scanf("%d", &FN->reach);
//        scanf("%d", &FN->Latest);
//        FN->Latest  += FN->reach;
//        scanf("%d", &FN->Sum_Time);
//        FN++;
//    }
//}
//char * Yes_No(int k, int n, FET FN[])
//{
//    if (n == 0)
//    {
//        return "YES";
//    }
//    int i  = 0;
//    for (i = 0; i < n; i++)
//    {
//        if (FN[i].Latest  >= k)
//        {
//            Swap(FN + i, FN);//交换
//            if (*Yes_No(Max(k, FN->reach) + FN->Sum_Time, n - 1, FN + 1) == 'Y')
//            {
//                return "YES";
//            }
//            Swap(FN + i, FN);//交换
//        }
//    }
//    return "NO";
//}
//void Swap(FET* a, FET* b)
//{
//    FET t  = *a;
//    *a  = *b;
//    *b  = t;
//}
//int Max(int x, int y)
//{
//    if (x > y)
//    {
//        return x;
//    }
//    return y;
//}
//int main()
//{
//    int T  = 0;
//    scanf("%d", &T);
//    while (T-- > 0)
//    {
//        int N  = 0;
//        scanf("%d", &N);
//        FET FN[N];
//        Fun(N, FN);
//        puts(Yes_No(0, N, FN));
//    }
//    return 0;
//}

#include <iostream> // bits/C++
#include <algorithm>
#include <cstdbool>
#include <cstring>
using namespace std;

struct plane
{
    int _t;
    int _d;
    int _l;
}a[11];

bool judge[11] = { false };

// 记录符合的次数3 // 现在的时间
bool dfs(int count, int cur, int n)
{
    if (count > n)
    {
        return true;
    }
    // 数组中的每个元素都递归几次。O(N^2)
    for (int i = 0; i < n; ++i)
    {
        // 已判断的可以跳过了
        if (judge[i] || a[i]._t + a[i]._d < cur)
        {
            continue;
        }
        // 假设i位置满足条件
        judge[i] = true;
        if (dfs(count + 1, max(cur, a[i]._t) + a[i]._l, n))
        {
            judge[i] = false;
            // 一个为真，说明他后面的也为真，不然也传不下来。
            return true;
        }
        // 假设不成立
        judge[i] = false;
    }

    return false;
}

int main()
{
    int T;
    cin >> T;

    while (T--)
    {
        int n;
        cin >> n;

        for (int i = 0; i < n; ++i)
        {
            cin >> a[i]._t >> a[i]._d >> a[i]._l ;
        }

        memset(judge, 0, sizeof(judge));
        // 一是假设为真，因为第一架飞机不需要条件。
        if (dfs(1, 0, n))
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }

    return 0;
}